﻿// Lavet af Andreas Horst DM10x (3.semester)!
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

// Usings bruges til at skabe forbindelse til databasen.
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;

using Model;
using Interfaces;

namespace ControllerLag
{
    // DBfacade-klassen (til at "mappe" data over med fra den relationelle database med).
    public class DBfacade
    {
        private string conStr; // Connection-string variable.
        private SqlConnection sqlCon; // Sql-Connection/db-connection.
        private SqlCommand cmd; // Sql-command type.
        private Controller conSystem; // Controlleren.

        public DBfacade(Controller controller)
        {
            // Connection-string til Andreas Horst's Server i Cisco-Lab.
            conStr = @"Data Source=WIN-N7QVHV1OSES\SQLEXPRESS;Initial catalog=SleepNet;User Id=Thomas;Password=Administrator123456;";
            //conStr = @"Data Source=.\SQLEXPRESS;Initial Catalog=SleepNet;Integrated Security=SSPI";

            conSystem = controller;
            sqlCon = new SqlConnection(conStr);
            cmd = new SqlCommand();

            cmd.Connection = sqlCon;
            // Bruger stored procedures som kommunikations fundament.
            cmd.CommandType = CommandType.StoredProcedure;
        }

        public void IndlæsFraDatabasen()
        {
            IndlæsKunder();
            IndlæsVarer();
            IndlæsSælger();
            IndlæsHomeParty();
            IndlæsOrdre();
            IndlæsDelOrdre();
        }

        // Virker!
        #region Kunde Operationer (Indlæs, Opret, Find, Rediger)
        public void IndlæsKunder()
        {
            SqlDataReader sqlReader;

            string navn;
            string adresse;
            string mail;
            int postNr;
            int kundeNr;
            long tlfNr;

            cmd.Parameters.Clear();
            cmd.CommandText = "IndlæsKunde";

            try
            {
                sqlCon.Open();
                sqlReader = cmd.ExecuteReader();

                while (sqlReader.Read() == true)
                {
                    navn = (string)sqlReader["Navn"];
                    adresse = (string)sqlReader["Adresse"];
                    mail = (string)sqlReader["Mail"];
                    postNr = (int)sqlReader["Postnr"];
                    kundeNr = (int)sqlReader["KundeId"];
                    tlfNr = (long)sqlReader["Tlf"];

                    conSystem.IndlæsKunder(navn, adresse, postNr, kundeNr, tlfNr, mail);
                }

                sqlCon.Close(); // Lukker database-connection.
            }
            catch (SqlException ex1)
            {
                if (sqlCon.State == ConnectionState.Open)
                {
                    sqlCon.Close();
                }
                throw ex1;
            }
            finally
            {
                sqlCon.Close(); // Last frontier ... lukker database-connection.
            }
        }

        public int OpretKunde(string navn, string adresse, int postNr, long tlfNr, string mail)
        {
            cmd.CommandText = "OpretKunde";
            cmd.Parameters.Clear();
            int kundeNr;

            // Sætter værdierne i parameter
            SqlParameter parameter = new SqlParameter("@Navn", SqlDbType.NVarChar);
            parameter.Value = navn;
            cmd.Parameters.Add(parameter);

            parameter = new SqlParameter("@Adresse", SqlDbType.NVarChar);
            parameter.Value = adresse;
            cmd.Parameters.Add(parameter);

            parameter = new SqlParameter("@PostNr", SqlDbType.Int);
            parameter.Value = postNr;
            cmd.Parameters.Add(parameter);

            parameter = new SqlParameter("@Tlf", SqlDbType.BigInt);
            parameter.Value = tlfNr;
            cmd.Parameters.Add(parameter);

            parameter = new SqlParameter("@Mail", SqlDbType.NVarChar);
            parameter.Value = mail;
            cmd.Parameters.Add(parameter);

            // Output-parameter
            parameter = new SqlParameter("@KundeId", SqlDbType.Int);
            parameter.Direction = ParameterDirection.Output;
            cmd.Parameters.Add(parameter);

            try
            {
                sqlCon.Open(); // Åbner connection til databasen.
                cmd.ExecuteNonQuery(); // Eksekverer kommandoer
                sqlCon.Close(); // Lukker forbindelsen.
                kundeNr = (int)parameter.Value; // Får id med tilbage.
            }
            catch (SqlException ex2)
            {
                if (sqlCon.State == ConnectionState.Open)
                {
                    sqlCon.Close(); // Lukker forbindelsen til databasen.
                }

                return -1;
                throw ex2; // Kaster exception tilbage.
            }
            finally
            {
                sqlCon.Close(); // Last frontier ... lukker forbindelsen uanset hvad!
            }

            return kundeNr;
        }

        public bool RedigerKunde(int kundeNr, string navn, string adresse, int postNr, long tlfNr, string mail)
        {
            int NoOfRowsEffected;

            cmd.CommandText = "@RedigerKunde";
            cmd.Parameters.Clear();

            SqlParameter parameter = new SqlParameter("@Navn", SqlDbType.NVarChar);
            parameter.Value = navn;
            cmd.Parameters.Add(parameter);

            parameter = new SqlParameter("@Adresse", SqlDbType.NVarChar);
            parameter.Value = adresse;
            cmd.Parameters.Add(parameter);

            parameter = new SqlParameter("@Postnr", SqlDbType.Int);
            parameter.Value = postNr;
            cmd.Parameters.Add(parameter);

            parameter = new SqlParameter("@Tlf", SqlDbType.BigInt);
            parameter.Value = tlfNr;
            cmd.Parameters.Add(parameter);

            parameter = new SqlParameter("@Mail", SqlDbType.NVarChar);
            parameter.Value = mail;
            cmd.Parameters.Add(parameter);

            parameter = new SqlParameter("@KundeId", SqlDbType.Int);
            parameter.Value = kundeNr;
            cmd.Parameters.Add(parameter);

            try
            {
                sqlCon.Open();
                NoOfRowsEffected = cmd.ExecuteNonQuery();
                sqlCon.Close();
            }
            catch (SqlException ex4)
            {
                if (sqlCon.State == ConnectionState.Open)
                {
                    sqlCon.Close();
                }

                return false;
                throw ex4;
            }
            finally
            {
                sqlCon.Close();
            }

            if (NoOfRowsEffected == 1)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        public bool HentKunde(int kundeNr)
        {
            SqlDataReader sqlReader;
            // kundeNr = (long)cmd.ExecuteScalar(); // Eksekverer kommandoer.

            cmd.Parameters.Clear(); // Husk!

            cmd.CommandText = "HentKunde";

            // Sætter værdierne i parameter.
            SqlParameter parameter = new SqlParameter("@KundeId", SqlDbType.BigInt);
            parameter.Value = kundeNr;
            cmd.Parameters.Add(parameter);

            try
            {
                sqlCon.Open();
                sqlReader = cmd.ExecuteReader();

                while (sqlReader.Read() == true)
                {
                    int kundeId = (int)sqlReader["KundeId"];
                    string navn = (string)sqlReader["Navn"];
                    string adresse = (string)sqlReader["Adresse"];
                    string mail = (string)sqlReader["Mail"];
                    int postnr = (int)sqlReader["PostNr"];
                    long tlf = (long)sqlReader["Tlf"];

                    conSystem.IndlæsKunder(navn, adresse, postnr, kundeId, tlf, mail);
                }

                sqlCon.Close();
            }
            catch (SqlException)
            {
                if (sqlCon.State == ConnectionState.Open)
                {
                    sqlCon.Close();
                }

                //kundeNr = (long)cmd.ExecuteScalar();
                return false;
            }

            return true;
        }
        #endregion

        // Virker!
        #region Vare Operationer (Indlæs, Opret, Find, Rediger)
        public void IndlæsVarer()
        {
            SqlDataReader sqlReader;

            int vareNr;
            string navn;
            string beskrivelse;
            double pris;
            bool aktiv;

            cmd.Parameters.Clear();
            cmd.CommandText = "IndlæsVare";

            try
            {
                sqlCon.Open();
                sqlReader = cmd.ExecuteReader();

                while (sqlReader.Read() == true)
                {
                    vareNr = (int)sqlReader["VareId"];
                    navn = (string)sqlReader["Navn"];
                    beskrivelse = (string)sqlReader["Beskrivelse"];
                    pris = Convert.ToDouble(sqlReader["Pris"]);
                    aktiv = (bool)sqlReader["Aktiv"];

                    conSystem.IndlæsVare(vareNr, navn, beskrivelse, pris, aktiv);
                }

                sqlCon.Close(); // Lukker database-connection.
            }
            catch (SqlException ex1)
            {
                if (sqlCon.State == ConnectionState.Open)
                {
                    sqlCon.Close();
                }
                throw ex1;
            }
            finally
            {
                sqlCon.Close(); // Last frontier ... lukker database-connection.
            }
        }

        public bool HentVare(int vareNr)
        {
            SqlDataReader sqlReader;
            vareNr = (int)cmd.ExecuteScalar(); // Eksekverer kommandoer.

            cmd.Parameters.Clear(); // Husk!

            cmd.CommandText = "HentVareId";

            // Sætter værdierne i parameter.
            SqlParameter parameter = new SqlParameter("@VareId", SqlDbType.Int);
            parameter.Value = vareNr;
            cmd.Parameters.Add(parameter);

            try
            {
                sqlCon.Open();
                sqlReader = cmd.ExecuteReader();

                while (sqlReader.Read() == true)
                {
                    vareNr = (int)sqlReader["KundeId"];
                }

                sqlCon.Close();
            }
            catch (SqlException)
            {
                if (sqlCon.State == ConnectionState.Open)
                {
                    sqlCon.Close();
                }

                vareNr = (int)cmd.ExecuteScalar();
                return false;
            }

            return true;
        }

        public int OpretVare(string navn, string beskrivelse, double pris, bool aktiv)
        {
            cmd.CommandText = "OpretVare";
            cmd.Parameters.Clear();
            int vareNr;

            // Sætter værdierne i parameter
            SqlParameter parameter = new SqlParameter("@Navn", SqlDbType.NVarChar);
            parameter.Value = navn;
            cmd.Parameters.Add(parameter);

            parameter = new SqlParameter("@Beskrivelse", SqlDbType.NVarChar);
            parameter.Value = beskrivelse;
            cmd.Parameters.Add(parameter);

            parameter = new SqlParameter("@Pris", SqlDbType.Decimal);
            parameter.Value = pris;
            cmd.Parameters.Add(parameter);

            parameter = new SqlParameter("@Aktiv", SqlDbType.Bit);
            parameter.Value = aktiv;
            cmd.Parameters.Add(parameter);

            // Output-parameter
            parameter = new SqlParameter("@VareId", SqlDbType.Int);
            parameter.Direction = ParameterDirection.Output;
            cmd.Parameters.Add(parameter);

            try
            {
                sqlCon.Open(); // Åbner connection til databasen.
                cmd.ExecuteNonQuery(); // Eksekverer kommandoer
                sqlCon.Close(); // Lukker forbindelsen.
                vareNr = (int)parameter.Value;
            }
            catch (SqlException ex3)
            {
                if (sqlCon.State == ConnectionState.Open)
                {
                    sqlCon.Close(); // Lukker forbindelsen til databasen.
                }

                return -1;
                throw ex3; // Kaster exception tilbage.
            }
            finally
            {
                sqlCon.Close(); // Last frontier ... lukker forbindelsen uanset hvad!
            }

            return vareNr;
        }

        public bool RedigerVare(int vareNr, string navn, string beskrivelse, double pris, bool aktiv)
        {
            int NoOfRowsEffected;

            cmd.CommandText = "@RedigerVare";
            cmd.Parameters.Clear();

            SqlParameter parameter = new SqlParameter("@Navn", SqlDbType.NVarChar);
            parameter.Value = navn;
            cmd.Parameters.Add(parameter);

            parameter = new SqlParameter("@Beskrivelse", SqlDbType.NVarChar);
            parameter.Value = beskrivelse;
            cmd.Parameters.Add(parameter);

            parameter = new SqlParameter("@Pris", SqlDbType.Decimal);
            parameter.Value = pris;
            cmd.Parameters.Add(parameter);

            parameter = new SqlParameter("@Aktiv", SqlDbType.Bit);
            parameter.Value = aktiv;
            cmd.Parameters.Add(parameter);

            parameter = new SqlParameter("@VareId", SqlDbType.Int);
            parameter.Value = vareNr;
            cmd.Parameters.Add(parameter);

            try
            {
                sqlCon.Open();
                NoOfRowsEffected = cmd.ExecuteNonQuery();
                sqlCon.Close();
            }
            catch (SqlException ex4)
            {
                if (sqlCon.State == ConnectionState.Open)
                {
                    sqlCon.Close();
                }

                return false;
                throw ex4;
            }
            finally
            {
                sqlCon.Close();
            }

            if (NoOfRowsEffected == 1)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        #endregion

        // Skulle virke, men problemer i controller!
        #region Ordre Operationer (Indlæs, Opret, Find, Rediger)
        public void IndlæsOrdre()
        {
            SqlDataReader sqlReader;

            int ordreNr;
            DateTime ordreDato;
            int homePartyNr;
            int sælgerNr;

            cmd.Parameters.Clear();
            cmd.CommandText = "IndlæsOrdre";

            try
            {
                sqlCon.Open();
                sqlReader = cmd.ExecuteReader();

                while (sqlReader.Read() == true)
                {
                    ordreNr = (int)sqlReader["OrdreId"];
                    ordreDato = (DateTime)sqlReader["OrdreDato"];
                    homePartyNr = (int)sqlReader["HomePartyId"];
                    sælgerNr = (int)sqlReader["SælgerId"];

                    conSystem.IndlæsOrdre(ordreNr, ordreDato, homePartyNr, sælgerNr);
                }

                sqlCon.Close(); // Lukker database-connection.
            }
            catch (SqlException ex1)
            {
                if (sqlCon.State == ConnectionState.Open)
                {
                    sqlCon.Close();
                }
                throw ex1;
            }
            finally
            {
                sqlCon.Close(); // Last frontier ... lukker database-connection.
            }
        }

        public bool HentOrdre(int ordreNr)
        {
            SqlDataReader sqlReader;
            ordreNr = (int)cmd.ExecuteScalar(); // Eksekverer kommandoer.

            cmd.Parameters.Clear(); // Husk!

            cmd.CommandText = "HentOrdreId";

            // Sætter værdierne i parameter.
            SqlParameter parameter = new SqlParameter("@OrdreId", SqlDbType.Int);
            parameter.Value = ordreNr;
            cmd.Parameters.Add(parameter);

            try
            {
                sqlCon.Open();
                sqlReader = cmd.ExecuteReader();

                while (sqlReader.Read() == true)
                {
                    ordreNr = (int)sqlReader["OrdreId"];
                }

                sqlCon.Close();
            }
            catch (SqlException)
            {
                if (sqlCon.State == ConnectionState.Open)
                {
                    sqlCon.Close();
                }

                ordreNr = (int)cmd.ExecuteScalar();
                return false;
            }

            return true;
        }

        public int OpretOrdre(DateTime ordreDato, int homePartyNr, int sælgerNr)
        {
            cmd.CommandText = "OpretOrdre";
            cmd.Parameters.Clear();
            int ordreNr;

            // Sætter værdierne i parameter
            SqlParameter parameter = new SqlParameter("@OrdreDato", SqlDbType.Date);
            parameter.Value = ordreDato;
            cmd.Parameters.Add(parameter);

            parameter = new SqlParameter("@HomePartyId", SqlDbType.Int);
            parameter.Value = homePartyNr;
            cmd.Parameters.Add(parameter);

            parameter = new SqlParameter("@SælgerId", SqlDbType.Int);
            parameter.Value = sælgerNr;
            cmd.Parameters.Add(parameter);

            // Output-parameter
            parameter = new SqlParameter("@OrdreId", SqlDbType.Int);
            parameter.Direction = ParameterDirection.Output;
            cmd.Parameters.Add(parameter);

            try
            {
                sqlCon.Open(); // Åbner connection til databasen.
                cmd.ExecuteNonQuery(); // Eksekverer kommandoer
                sqlCon.Close(); // Lukker forbindelsen.
                ordreNr = (int)parameter.Value;

                return ordreNr;
            }
            catch (SqlException ex3)
            {
                if (sqlCon.State == ConnectionState.Open)
                {
                    sqlCon.Close(); // Lukker forbindelsen til databasen.
                }

                return -1;
                throw ex3; // Kaster exception tilbage.
            }
            finally
            {
                sqlCon.Close(); // Last frontier ... lukker forbindelsen uanset hvad!
            }

          
        }

        public bool RedigerOrdre(int ordreNr, DateTime ordreDato, int homePartyNr, int sælgerNr)
        {
            int NoOfRowsEffected;

            cmd.CommandText = "@RedigerOrdre";
            cmd.Parameters.Clear();

            SqlParameter parameter = new SqlParameter("@OrdreDato", SqlDbType.Date);
            parameter.Value = ordreDato;
            cmd.Parameters.Add(parameter);

            parameter = new SqlParameter("@HomePartyId", SqlDbType.Int);
            parameter.Value = homePartyNr;
            cmd.Parameters.Add(parameter);

            parameter = new SqlParameter("@SælgerId", SqlDbType.Int);
            parameter.Value = sælgerNr;
            cmd.Parameters.Add(parameter);

            parameter = new SqlParameter("@OrdreId", SqlDbType.Int);
            parameter.Value = ordreNr;
            cmd.Parameters.Add(parameter);

            try
            {
                sqlCon.Open();
                NoOfRowsEffected = cmd.ExecuteNonQuery();
                sqlCon.Close();
            }
            catch (SqlException ex4)
            {
                if (sqlCon.State == ConnectionState.Open)
                {
                    sqlCon.Close();
                }

                return false;
                throw ex4;
            }
            finally
            {
                sqlCon.Close();
            }

            if (NoOfRowsEffected == 1)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        #endregion

        #region HomeParty Operationer (Indlæs, Opret, Find, Rediger)
        public void IndlæsHomeParty()
        {
            SqlDataReader sqlReader;

            int homePartyNr;
            DateTime dato;
            int region;
            int sælgerNr;
            int kundeNr;

            cmd.Parameters.Clear();
            cmd.CommandText = "IndlæsHomeParty";

            try
            {
                sqlCon.Open();
                sqlReader = cmd.ExecuteReader();

                while (sqlReader.Read() == true)
                {
                    homePartyNr = (int)sqlReader["HomePartyId"];
                    dato = (DateTime)sqlReader["Dato"];
                    region = (int)sqlReader["Region"];
                    sælgerNr = (int)sqlReader["SælgerId"];
                    kundeNr = (int)sqlReader["KundeId"];

                    conSystem.IndlæsHomeParty(homePartyNr, dato, region, sælgerNr, kundeNr);
                }

                sqlCon.Close(); // Lukker database-connection.
            }
            catch (SqlException ex1)
            {
                if (sqlCon.State == ConnectionState.Open)
                {
                    sqlCon.Close();
                }
                throw ex1;
            }
            finally
            {
                sqlCon.Close(); // Last frontier ... lukker database-connection.
            }
        }

        public bool HentHomeParty(int homePartyNr)
        {
            SqlDataReader sqlReader;
            homePartyNr = (int)cmd.ExecuteScalar(); // Eksekverer kommandoer.

            cmd.Parameters.Clear(); // Husk!

            cmd.CommandText = "HomePartyId";

            // Sætter værdierne i parameter.
            SqlParameter parameter = new SqlParameter("@HomePartyId", SqlDbType.Int);
            parameter.Value = homePartyNr;
            cmd.Parameters.Add(parameter);

            try
            {
                sqlCon.Open();
                sqlReader = cmd.ExecuteReader();

                while (sqlReader.Read() == true)
                {
                    homePartyNr = (int)sqlReader["HomePartyId"];
                }

                sqlCon.Close();
            }
            catch (SqlException)
            {
                if (sqlCon.State == ConnectionState.Open)
                {
                    sqlCon.Close();
                }

                homePartyNr = (int)cmd.ExecuteScalar();
                return false;
            }

            return true;
        }

        public int OpretHomeParty(DateTime dato, int region, int sælgerNr, int kundeNr)
        {
            cmd.CommandText = "OpretHomeParty";
            cmd.Parameters.Clear();

            // Sætter værdierne i parameter
            SqlParameter parameter = new SqlParameter("@Dato", SqlDbType.DateTime);
            parameter.Value = dato;
            cmd.Parameters.Add(parameter);

            parameter = new SqlParameter("@Region", SqlDbType.Int);
            parameter.Value = region;
            cmd.Parameters.Add(parameter);

            parameter = new SqlParameter("@SælgerId", SqlDbType.Int);
            parameter.Value = sælgerNr;
            cmd.Parameters.Add(parameter);

            parameter = new SqlParameter("@KundeId", SqlDbType.Int);
            parameter.Value = kundeNr;
            cmd.Parameters.Add(parameter);

            // Output-parameter
            parameter = new SqlParameter("@HomePartyId", SqlDbType.Int);
            parameter.Direction = ParameterDirection.Output;
            cmd.Parameters.Add(parameter);

            try
            {
                sqlCon.Open(); // Åbner connection til databasen.
                cmd.ExecuteNonQuery(); // Eksekverer kommandoer
                sqlCon.Close(); // Lukker forbindelsen.
            }
            catch (SqlException ex3)
            {
                if (sqlCon.State == ConnectionState.Open)
                {
                    sqlCon.Close(); // Lukker forbindelsen til databasen.
                }

                return -1;
                throw ex3; // Kaster exception tilbage.
            }
            finally
            {
                sqlCon.Close(); // Last frontier ... lukker forbindelsen uanset hvad!
            }

            return (int)parameter.Value;
        }

        public bool RedigerHomeParty(int homePartyNr, DateTime dato, int region, int sælgerNr, int kundeNr)
        {
            int NoOfRowsEffected;

            cmd.CommandText = "@RedigerHomeParty";
            cmd.Parameters.Clear();

            SqlParameter parameter = new SqlParameter("@Dato", SqlDbType.DateTime);
            parameter.Value = dato;
            cmd.Parameters.Add(parameter);

            parameter = new SqlParameter("@Region", SqlDbType.Int);
            parameter.Value = region;
            cmd.Parameters.Add(parameter);

            parameter = new SqlParameter("@SælgerId", SqlDbType.Int);
            parameter.Value = sælgerNr;
            cmd.Parameters.Add(parameter);

            parameter = new SqlParameter("@KundeId", SqlDbType.Int);
            parameter.Value = kundeNr;
            cmd.Parameters.Add(parameter);

            parameter = new SqlParameter("@HomePartyId", SqlDbType.Int);
            parameter.Value = homePartyNr;
            cmd.Parameters.Add(parameter);

            try
            {
                sqlCon.Open();
                NoOfRowsEffected = cmd.ExecuteNonQuery();
                sqlCon.Close();
            }
            catch (SqlException ex4)
            {
                if (sqlCon.State == ConnectionState.Open)
                {
                    sqlCon.Close();
                }

                return false;
                throw ex4;
            }
            finally
            {
                sqlCon.Close();
            }

            if (NoOfRowsEffected == 1)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

		public bool HentKundeHomeparties(int kundenr)
		{
			cmd.CommandText = "HentKundeHomeparties";
            cmd.Parameters.Clear();

            SqlParameter parameter = new SqlParameter("@KundeId", SqlDbType.Int);
            parameter.Value = kundenr;
            cmd.Parameters.Add(parameter);
			Homeparty homeparty = null;

            try
            {
                sqlCon.Open();
                SqlDataReader sqlreader = cmd.ExecuteReader();
                Kunde kunde = conSystem.FindKunde(kundenr);

            	while (sqlreader.Read())
            	{
					int sælgerid = (int)sqlreader["SælgerId"];
					string navn = (string)sqlreader["Navn"];
					string mail = (string)sqlreader["Mail"];
					string adresse = (string)sqlreader["Adresse"];
					long tlf = (long)sqlreader["Tlf"];
					int postnr = (int)sqlreader["PostNr"];
					string by = (string)sqlreader["Bynavn"];
					conSystem.IndlæsSælger(sælgerid, navn, adresse, postnr, tlf, mail, by);

					int homepartyid = (int)sqlreader["HomePartyId"];
					DateTime dato = (DateTime)sqlreader["Dato"];
					int region = (int)sqlreader["Region"];

					homeparty = conSystem.FindHomeparty(homepartyid);
					if (homeparty == null)
					{
						conSystem.IndlæsHomeParty(homepartyid, dato, sælgerid, region, kunde);
					}
					else
					{
						homeparty.Dato = dato;
						homeparty.Sælger = conSystem.FindSælger(sælgerid);
						homeparty.Region = (Landsdel)region;
					}

				}
				sqlCon.Close();
            }
            catch (SqlException)
            {
                if (sqlCon.State == ConnectionState.Open)
                {
                    sqlCon.Close();
                }
                return false;
            }
            return true;
        }
        #endregion

        // Virker!
        #region Sælger Operationer (Indlæs, Opret, Find, Rediger)
        public void IndlæsSælger()
        {
            SqlDataReader sqlReader;

            int sælgerNr;
            string navn;
            string adresse;
            int postNr;
            long tlfNr;
            string mail;
            string bynavn;

            cmd.Parameters.Clear();
            cmd.CommandText = "IndlæsSælger";

            try
            {
                sqlCon.Open();
                sqlReader = cmd.ExecuteReader();

                while (sqlReader.Read() == true)
                {
                    sælgerNr = (int)sqlReader["SælgerId"];
                    navn = (string)sqlReader["Navn"];
                    adresse = (string)sqlReader["Adresse"];
                    postNr = (int)sqlReader["SælgerId"];
                    tlfNr = (long)sqlReader["Tlf"];
                    mail = (string)sqlReader["Mail"];

                    conSystem.IndlæsSælger(sælgerNr, navn, adresse, postNr, tlfNr, mail);
                }

                sqlCon.Close(); // Lukker database-connection.
            }
            catch (SqlException ex1)
            {
                if (sqlCon.State == ConnectionState.Open)
                {
                    sqlCon.Close();
                }
                throw ex1;
            }
            finally
            {
                sqlCon.Close(); // Last frontier ... lukker database-connection.
            }
        }

        public bool HentSælger(int sælgerNr)
        {
            SqlDataReader sqlReader;
            int delordreNr = (int)cmd.ExecuteScalar(); // Eksekverer kommandoer.

            cmd.Parameters.Clear(); // Husk!

            cmd.CommandText = "SælgerId";

            // Sætter værdierne i parameter.
            SqlParameter parameter = new SqlParameter("@SælgerId", SqlDbType.Int);
            parameter.Value = delordreNr;
            cmd.Parameters.Add(parameter);

            try
            {
                sqlCon.Open();
                sqlReader = cmd.ExecuteReader();

                while (sqlReader.Read() == true)
                {
                    delordreNr = (int)sqlReader["SælgerId"];
                }

                sqlCon.Close();
            }
            catch (SqlException)
            {
                if (sqlCon.State == ConnectionState.Open)
                {
                    sqlCon.Close();
                }

                delordreNr = (int)cmd.ExecuteScalar();
                return false;
            }

            return true;
        }

        public int OpretSælger(string navn, string adresse, int postNr, long tlfNr, string mail)
        {
            cmd.CommandText = "OpretSælger";
            cmd.Parameters.Clear();
            int sælgerNr;

            // Sætter værdierne i parameter
            SqlParameter parameter = new SqlParameter("@Navn", SqlDbType.NVarChar);
            parameter.Value = navn;
            cmd.Parameters.Add(parameter);

            parameter = new SqlParameter("@Adresse", SqlDbType.NVarChar);
            parameter.Value = adresse;
            cmd.Parameters.Add(parameter);

            parameter = new SqlParameter("@Postnr", SqlDbType.Int);
            parameter.Value = postNr;
            cmd.Parameters.Add(parameter);

            parameter = new SqlParameter("@Tlf", SqlDbType.BigInt);
            parameter.Value = tlfNr;
            cmd.Parameters.Add(parameter);

            parameter = new SqlParameter("@Mail", SqlDbType.NVarChar);
            parameter.Value = mail;
            cmd.Parameters.Add(parameter);

            // Output-parameter
            parameter = new SqlParameter("@SælgerId", SqlDbType.Int);
            parameter.Direction = ParameterDirection.Output;
            cmd.Parameters.Add(parameter);

            try
            {
                sqlCon.Open(); // Åbner connection til databasen.
                cmd.ExecuteNonQuery(); // Eksekverer kommandoer
                sqlCon.Close(); // Lukker forbindelsen.
                sælgerNr = (int)parameter.Value;
            }
            catch (SqlException ex3)
            {
                if (sqlCon.State == ConnectionState.Open)
                {
                    sqlCon.Close(); // Lukker forbindelsen til databasen.
                }

                return -1;
                throw ex3; // Kaster exception tilbage.
            }
            finally
            {
                sqlCon.Close(); // Last frontier ... lukker forbindelsen uanset hvad!
            }

            return sælgerNr;
        }

        public bool RedigerSælger(int sælgerNr, string navn, string adresse, int postNr, long tlfNr, string mail)
        {
            int NoOfRowsEffected;

            cmd.CommandText = "@RedigerSælger";
            cmd.Parameters.Clear();

            SqlParameter parameter = new SqlParameter("@Navn", SqlDbType.NVarChar);
            parameter.Value = navn;
            cmd.Parameters.Add(parameter);

            parameter = new SqlParameter("@Adresse", SqlDbType.NVarChar);
            parameter.Value = adresse;
            cmd.Parameters.Add(parameter);

            parameter = new SqlParameter("@Postnr", SqlDbType.Int);
            parameter.Value = postNr;
            cmd.Parameters.Add(parameter);

            parameter = new SqlParameter("@Tlf", SqlDbType.BigInt);
            parameter.Value = tlfNr;
            cmd.Parameters.Add(parameter);

            parameter = new SqlParameter("@Mail", SqlDbType.NVarChar);
            parameter.Value = mail;
            cmd.Parameters.Add(parameter);

            parameter = new SqlParameter("@SælgerId", SqlDbType.Int);
            parameter.Value = sælgerNr;
            cmd.Parameters.Add(parameter);

            try
            {
                sqlCon.Open();
                NoOfRowsEffected = cmd.ExecuteNonQuery();
                sqlCon.Close();
            }
            catch (SqlException ex4)
            {
                if (sqlCon.State == ConnectionState.Open)
                {
                    sqlCon.Close();
                }

                return false;
                throw ex4;
            }
            finally
            {
                sqlCon.Close();
            }

            if (NoOfRowsEffected == 1)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        #endregion

        #region Delordre Operationer (Indlæs, Opret, Find, Rediger)
        public void IndlæsDelOrdre()
        {
            SqlDataReader sqlReader;

            int delordreNr;
            int kundeNr;
            bool betalt;
            Betalingsmetode betalingstype;
            string betalingsKommentar;
            int ordreNr;

            cmd.Parameters.Clear();
            cmd.CommandText = "IndlæsDelOrdre";

            try
            {
                sqlCon.Open();
                sqlReader = cmd.ExecuteReader();

                while (sqlReader.Read() == true)
                {
                    delordreNr = (int)sqlReader["DelordreId"];
                    kundeNr = (int)sqlReader["KundeId"];
                    betalt = (bool)sqlReader["Betalt"];
                    betalingstype = (Betalingsmetode)sqlReader["Betalingstype"];
                    betalingsKommentar = (string)sqlReader["Betalingskommentar"];
                    ordreNr = (int)sqlReader["OrdreId"];

                    conSystem.IndlæsDelOrdre(ordreNr, kundeNr, delordreNr, betalt, betalingstype, betalingsKommentar);
                }

                sqlCon.Close(); // Lukker database-connection.
            }
            catch (SqlException ex1)
            {
                if (sqlCon.State == ConnectionState.Open)
                {
                    sqlCon.Close();
                }
                throw ex1;
            }
            finally
            {
                sqlCon.Close(); // Last frontier ... lukker database-connection.
            }
        }

        #region Bruges ikke mere
        //---------------------------------------------Allerede implementeret--------------------------------------
        //public bool HentSælgere(int delordreNr)
        //{
        //    SqlDataReader sqlReader;
        //    delordreNr = (int)cmd.ExecuteScalar(); // Eksekverer kommandoer.

        //    cmd.Parameters.Clear(); // Husk!

        //    cmd.CommandText = "DelordreId";

        //    // Sætter værdierne i parameter.
        //    SqlParameter parameter = new SqlParameter("@DelordreId", SqlDbType.Int);
        //    parameter.Value = delordreNr;
        //    cmd.Parameters.Add(parameter);

        //    try
        //    {
        //        sqlCon.Open();
        //        sqlReader = cmd.ExecuteReader();

        //        while (sqlReader.Read() == true)
        //        {
        //            delordreNr = (int)sqlReader["DelordreId"];
        //        }

        //        sqlCon.Close();
        //    }
        //    catch (SqlException)
        //    {
        //        if (sqlCon.State == ConnectionState.Open)
        //        {
        //            sqlCon.Close();
        //        }

        //        delordreNr = (int)cmd.ExecuteScalar();
        //        return false;
        //    }

        //    return true;
        //}
        #endregion

        public int OpretDelordre(int kundeNr, bool betalt, int betalingstype, string betalingsKommentar, int ordreNr)
        {
            cmd.CommandText = "OpretDelordre";
            cmd.Parameters.Clear();

            // Sætter værdierne i parameter
            SqlParameter parameter = new SqlParameter("@KundeId", SqlDbType.Int);
            parameter.Value = kundeNr;
            cmd.Parameters.Add(parameter);

            parameter = new SqlParameter("@Betalt", SqlDbType.Bit);
            parameter.Value = betalt;
            cmd.Parameters.Add(parameter);

            parameter = new SqlParameter("@Betalingstype", SqlDbType.Int);
            parameter.Value = betalingstype;
            cmd.Parameters.Add(parameter);

            parameter = new SqlParameter("@Betalingskommentar", SqlDbType.NVarChar);
            parameter.Value = betalingsKommentar;
            cmd.Parameters.Add(parameter);

            parameter = new SqlParameter("@OrdreId", SqlDbType.Int);
            parameter.Value = ordreNr;
            cmd.Parameters.Add(parameter);

            // Output-parameter
            parameter = new SqlParameter("@DelordreId", SqlDbType.Int);
            parameter.Direction = ParameterDirection.Output;
            cmd.Parameters.Add(parameter);

            try
            {
                sqlCon.Open(); // Åbner connection til databasen.
                cmd.ExecuteNonQuery(); // Eksekverer kommandoer
                sqlCon.Close(); // Lukker forbindelsen.
                return (int)parameter.Value;
            }
            catch (SqlException ex3)
            {
                if (sqlCon.State == ConnectionState.Open)
                {
                    sqlCon.Close(); // Lukker forbindelsen til databasen.
                }

                return -1;
                throw ex3; // Kaster exception tilbage.
            }
            finally
            {
                sqlCon.Close(); // Last frontier ... lukker forbindelsen uanset hvad!
            }

            return -1;
        }

        public bool RedigerDelordre(int delordreNr, int kundeNr, bool betalt, int betalingstype, string betalingsKommentar, int ordreNr)
        {
            int NoOfRowsEffected;

            cmd.CommandText = "@RedigerDelordre";
            cmd.Parameters.Clear();

            SqlParameter parameter = new SqlParameter("@KundeId", SqlDbType.Int);
            parameter.Value = kundeNr;
            cmd.Parameters.Add(parameter);

            parameter = new SqlParameter("@Betalt", SqlDbType.Bit);
            parameter.Value = betalt;
            cmd.Parameters.Add(parameter);

            parameter = new SqlParameter("@Betalingstype", SqlDbType.Int);
            parameter.Value = betalingstype;
            cmd.Parameters.Add(parameter);

            parameter = new SqlParameter("@Betalingskommentar", SqlDbType.NVarChar);
            parameter.Value = betalingsKommentar;
            cmd.Parameters.Add(parameter);

            parameter = new SqlParameter("@OrdreId", SqlDbType.Int);
            parameter.Value = ordreNr;
            cmd.Parameters.Add(parameter);

            parameter = new SqlParameter("@DelordreId", SqlDbType.Int);
            parameter.Value = delordreNr;
            cmd.Parameters.Add(parameter);

            try
            {
                sqlCon.Open();
                NoOfRowsEffected = cmd.ExecuteNonQuery();
                sqlCon.Close();
            }
            catch (SqlException ex4)
            {
                if (sqlCon.State == ConnectionState.Open)
                {
                    sqlCon.Close();
                }

                return false;
                throw ex4;
            }
            finally
            {
                sqlCon.Close();
            }

            if (NoOfRowsEffected == 1)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        public bool HentKundeDelordre(int kundeId)
        {
            cmd.CommandText = "HentKundeDelordrer";
            cmd.Parameters.Clear();

            SqlParameter parameter = new SqlParameter("@KundeId", SqlDbType.Int);
            parameter.Value = kundeId;
            cmd.Parameters.Add(parameter);

            try
            {
                sqlCon.Open();
                SqlDataReader sqlreader = cmd.ExecuteReader();
                Kunde kunde = null;
                Homeparty homeparty = null;
                Ordre ordre = null;
                Delordre delordre = null;
                int nuværendeHomepartyId = -1, nuværendeOrdreId = -1, nuværendeDelordreId = -1;

                Dictionary<int, Kunde> oprettedeKunder = new Dictionary<int, Kunde>();
                Dictionary<int, Vare> oprettedeVarer = new Dictionary<int, Vare>();
                oprettedeKunder.Add(kundeId, conSystem.FindKunde(kundeId));

                while (sqlreader.Read())
                {
                    // Henter Homeparty
                    int homepartyId = (int)sqlreader["HomePartyId"];
                    DateTime homepartyDato = (DateTime)sqlreader["Dato"];
                    int region = (int)sqlreader["Region"];

                    if (homepartyId != nuværendeHomepartyId)
                    {
                        // Henter værtinde
                        int værtindeId = (int)sqlreader["KundeId"];
                        string værtindeNavn = (string)sqlreader["KundeNavn"];
                        string adresse = (string)sqlreader["Adresse"];
                        string mail = (string)sqlreader["Mail"];
                        int postnr = (int)sqlreader["PostNr"];
                        string by = (string)sqlreader["Bynavn"];
                        long tlf = (long)sqlreader["Tlf"];

                        if (!oprettedeKunder.ContainsKey(værtindeId))
                            kunde = conSystem.IndlæsKunder(værtindeNavn, adresse, postnr, værtindeId, tlf, mail);
                        else
                            kunde = oprettedeKunder[værtindeId];

                        homeparty = conSystem.IndlæsHomeParty(homepartyId, homepartyDato, region, kunde);
                        nuværendeHomepartyId = homepartyId;

                        // Henter Ordre
                        int ordreId = (int)sqlreader["OrdreId"];
                        DateTime ordreDato = (DateTime)sqlreader["OrdreDato"];
                        ordre = conSystem.IndlæsOrdre(ordreId, ordreDato, homeparty);
                        nuværendeOrdreId = ordreId;

                        // Henter Delordre
                        int delordreId = (int)sqlreader["DelordreId"];
                        bool betalt = (bool)sqlreader["Betalt"];
                        Betalingsmetode betalingsmetode = (Betalingsmetode)sqlreader["Betalingstype"];

                        delordre = conSystem.IndlæsDelOrdre(ordre.Ordrenr, oprettedeKunder[kundeId], delordreId, betalt, betalingsmetode);
                    }

                    // Henter Vare
                    Vare vare;
                    int vareId = (int)sqlreader["VareId"];
                    if (oprettedeVarer.ContainsKey(vareId))
                    {
                        vare = oprettedeVarer[vareId];
                    }
                    else
                    {
                        string vareNavn = (string)sqlreader["VareNavn"];
                        string vareBeskrivelse = (string)sqlreader["Beskrivelse"];
                        vare = conSystem.IndlæsVare(vareId, vareNavn, vareBeskrivelse);
                        oprettedeVarer.Add(vareId, vare);
                    }

                    //Henter Delordrelinie
                    double pris = Convert.ToDouble(sqlreader["Pris"]);
                    int antal = (int)sqlreader["Antal"];
                    delordre.OpretDelordrelinie(vare, antal, pris);
                }
				sqlCon.Close();
            }
            catch (SqlException)
            {
                if (sqlCon.State == ConnectionState.Open)
                {
                    sqlCon.Close();
                }
                return false;
            }
            return true;
        }
        #endregion

        #region Distributør Operationer (Indlæs, Opret, Find, Rediger)
        public void IndlæsDistributør()
        {
            SqlDataReader sqlReader;

            int distributørNr;
            string navn;
            string adresse;
            int postNr;
            long tlfNr;
            int region;

            cmd.Parameters.Clear();
            cmd.CommandText = "DistributørOrdre";

            try
            {
                sqlCon.Open();
                sqlReader = cmd.ExecuteReader();

                while (sqlReader.Read() == true)
                {
                    distributørNr = (int)sqlReader["DistributørId"];
                    navn = (string)sqlReader["Navn"];
                    adresse = (string)sqlReader["Adresse"];
                    postNr = (int)sqlReader["Postnr"];
                    tlfNr = (long)sqlReader["Tlf"];
                    region = (int)sqlReader["Region"];

                    conSystem.DistributørOrdre(distributørNr, navn, adresse, postNr, tlfNr, region);
                }

                sqlCon.Close(); // Lukker database-connection.
            }
            catch (SqlException ex1)
            {
                if (sqlCon.State == ConnectionState.Open)
                {
                    sqlCon.Close();
                }
                throw ex1;
            }
            finally
            {
                sqlCon.Close(); // Last frontier ... lukker database-connection.
            }
        }

        public bool HentDistributør(int distributørNr)
        {
            SqlDataReader sqlReader;
            distributørNr = (int)cmd.ExecuteScalar(); // Eksekverer kommandoer.

            cmd.Parameters.Clear(); // Husk!

            cmd.CommandText = "DistributørId";

            // Sætter værdierne i parameter.
            SqlParameter parameter = new SqlParameter("@DistributørId", SqlDbType.Int);
            parameter.Value = distributørNr;
            cmd.Parameters.Add(parameter);

            try
            {
                sqlCon.Open();
                sqlReader = cmd.ExecuteReader();

                while (sqlReader.Read() == true)
                {
                    distributørNr = (int)sqlReader["DistributørId"];
                }

                sqlCon.Close();
            }
            catch (SqlException)
            {
                if (sqlCon.State == ConnectionState.Open)
                {
                    sqlCon.Close();
                }

                distributørNr = (int)cmd.ExecuteScalar();
                return false;
            }

            return true;
        }

        public int OpretDistributør(string navn, string adresse, int postNr, long tlfNr, int region)
        {
            cmd.CommandText = "OpretDistributør";
            cmd.Parameters.Clear();
            int distributørNr;

            // Sætter værdierne i parameter
            SqlParameter parameter = new SqlParameter("@Navn", SqlDbType.NVarChar);
            parameter.Value = navn;
            cmd.Parameters.Add(parameter);

            parameter = new SqlParameter("@Adresse", SqlDbType.NVarChar);
            parameter.Value = adresse;
            cmd.Parameters.Add(parameter);

            parameter = new SqlParameter("@Postnr", SqlDbType.Int);
            parameter.Value = postNr;
            cmd.Parameters.Add(parameter);

            parameter = new SqlParameter("@Tlf", SqlDbType.BigInt);
            parameter.Value = tlfNr;
            cmd.Parameters.Add(parameter);

            parameter = new SqlParameter("@Region", SqlDbType.Int);
            parameter.Value = region;
            cmd.Parameters.Add(parameter);

            // Output-parameter
            parameter = new SqlParameter("@DistributørId", SqlDbType.Int);
            parameter.Direction = ParameterDirection.Output;
            cmd.Parameters.Add(parameter);

            try
            {
                sqlCon.Open(); // Åbner connection til databasen.
                cmd.ExecuteNonQuery(); // Eksekverer kommandoer
                sqlCon.Close(); // Lukker forbindelsen.
                distributørNr = (int)parameter.Value;
            }
            catch (SqlException ex3)
            {
                if (sqlCon.State == ConnectionState.Open)
                {
                    sqlCon.Close(); // Lukker forbindelsen til databasen.
                }

                return -1;
                throw ex3; // Kaster exception tilbage.
            }
            finally
            {
                sqlCon.Close(); // Last frontier ... lukker forbindelsen uanset hvad!
            }

            return distributørNr;
        }

        public bool RedigerDistributør(int distributørNr, string navn, string adresse, int postNr, long tlfNr, int region)
        {
            int NoOfRowsEffected;

            cmd.CommandText = "@RedigerDistributør";
            cmd.Parameters.Clear();

            SqlParameter parameter = new SqlParameter("@Navn", SqlDbType.NVarChar);
            parameter.Value = navn;
            cmd.Parameters.Add(parameter);

            parameter = new SqlParameter("@Adresse", SqlDbType.NVarChar);
            parameter.Value = adresse;
            cmd.Parameters.Add(parameter);

            parameter = new SqlParameter("@Postnr", SqlDbType.Int);
            parameter.Value = postNr;
            cmd.Parameters.Add(parameter);

            parameter = new SqlParameter("@Tlf", SqlDbType.BigInt);
            parameter.Value = tlfNr;
            cmd.Parameters.Add(parameter);

            parameter = new SqlParameter("@Region", SqlDbType.Int);
            parameter.Value = region;
            cmd.Parameters.Add(parameter);

            parameter = new SqlParameter("@DistributørId", SqlDbType.Int);
            parameter.Value = distributørNr;
            cmd.Parameters.Add(parameter);

            try
            {
                sqlCon.Open();
                NoOfRowsEffected = cmd.ExecuteNonQuery();
                sqlCon.Close();
            }
            catch (SqlException ex4)
            {
                if (sqlCon.State == ConnectionState.Open)
                {
                    sqlCon.Close();
                }

                return false;
                throw ex4;
            }
            finally
            {
                sqlCon.Close();
            }

            if (NoOfRowsEffected == 1)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        #endregion
    }
}
